package design.leetcode_155;

import java.util.Stack;

public class MinStackHelper {
    class MinStack {
        //数据栈，存放所有的数据
        private final Stack<Integer> dataStack;
        //辅助栈，存放最小值
        private final Stack<Integer> minStack;

        public MinStack() {
            this.dataStack = new Stack<>();
            this.minStack = new Stack<>();
        }

        public void push(int x) {
            dataStack.push(x);
            if (minStack.isEmpty() || x <= minStack.peek()) {
                minStack.push(x);
            }
        }

        /**
         * 当栈顶元素相同时，辅助栈要和数据栈一起出栈。
         */
        public void pop() {
            if (!dataStack.isEmpty()) {
                /*
                    注意这里如果写成：
                    if (dataStack.pop() == minStack.peek()) {
                        minStack.pop();
                    }
                    如果栈中的元素在入栈是不在 -128 ~ 127 之间，将会在 dataStack 和 helper 中分别 new Integer()
                    此时如果使用 == 将会比较两个 Integer 对象的内存地址，并且这两个对象的地址必然不相同，将会导致 pop() 逻辑错误
                    解决方法：
                        1. 在 if 语句前面进行自动拆箱，将任意一个变量转换成 int 类型（如下代码）
                        2. 使用 equals() 方法进行比较
                            if (dataStack.pop().equals(minStack.peek())) {
                                minStack.pop();
                            }
                 */
                int data = dataStack.pop();
                if (data == minStack.peek()) {
                    minStack.pop();
                }
            }
        }

        // 和面试官交流 下面的两个操作是否会在空栈进行，不在空栈上进行可以不做非空判断
        public int top() {
            if (!dataStack.isEmpty()) {
                return dataStack.peek();
            }
            throw new RuntimeException("栈为空，非法操作");
        }

        public int getMin() {
            if (!minStack.isEmpty()) {
                return minStack.peek();
            }
            throw new RuntimeException("栈为空，非法操作");
        }
    }
}
